/**
 * Created by gilles on 14-02-15.
 */
// Définit une poistion x,y
function Point(x,y) {
    this.x = x;
    this.y = y;
    return this;
}

// Définit une largeur hauteur
function Dim(w,h) {
    this.w = w;
    this.h = h;
    return this;
}

// Définit un rectangle par point coin sup-gauche et largeur et hauteur
function RectWH(x,y,w,h) {
    this.pos = new Point(x,y);
    this.dim = new Dim(w,h);
    return this;
}

// Définit un rectangle par deux points (pas forcément coin sup-gauche ou coin inf-droit)
function Rect12(x1,y1,x2,y2) {
    this.pos1 = new Point(x1, y1);
    this.pos2 = new Point(x2, y2);

    /**
     * Fournit la largeur du rectangle
     */
    this.getWidth = function(){
        return Math.abs(this.pos1.x - this.pos2.x);
    };

    /**
     * Fournit la hauteur du rectangle
     */
    this.getHeight = function(){
        return Math.abs(this.pos1.y - this.pos2.y);
    };

    /**
     * Fournit le point représentant le coin supérieur gauche
     */
    this.getUpperLeftPos = function(){
        return new Point(Math.min(this.pos1.x, this.pos2.x), Math.min(this.pos1.y, this.pos2.y));
    };

    /**
     * Indique si la position posXY est à l'intérieur du rectangle
     */
    this.pointIsIn = function (posXY) {
        var is_inside_x = ((posXY.x >= this.pos1.x) && (posXY.x <= this.pos2.x)) || ((posXY.x >= this.pos2.x) && (posXY.x <= this.pos1.x));
        var is_inside_y = ((posXY.y >= this.pos1.y) && (posXY.y <= this.pos2.y)) || ((posXY.y >= this.pos2.y) && (posXY.y <= this.pos1.y));
        return is_inside_x && is_inside_y;
    }

    /**
     * "Déplace" le rectangle en X et en Y d'une quantité dx et dy
     */
    this.moveXY = function (dx,dy) {
        this.pos1.x += dx;
        this.pos2.x += dx;
        this.pos1.y += dy;
        this.pos2.y += dy;
    }

    return this;
}
function Pays(nom,rectangle) {
    this.nom = nom;
   // this.name= new String();
    this.rectangle = new Rect12(x1,y1,x2,y2);
    return this;
}

